﻿using Microsoft.Extensions.Configuration;
using SQLitePCL;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Shared.DataBaseConfig;
using Dapper.Database.Extensions;
using System.Reflection.Metadata.Ecma335;

namespace QuickFramework.Orm
{
    #region
    ///// <summary>
    ///// 数据库工厂
    ///// </summary>
    //public class DbFactory : IDbFactory
    //{
    //    //private static string m_ConnectionString;
    //    //private static DatabaseType m_DatabaseType = DatabaseType.None;
    //    private string m_ConnectionStringName = string.Empty;
    //    public DbFactory()
    //    { }
    //    /// <summary>
    //    /// 设置链接字符串名称
    //    /// </summary>
    //    /// <param name="connectionStringName"></param>
    //    /// <returns></returns>
    //    public bool SetConnectionStringName(string connectionStringName)
    //    {
    //        if (string.IsNullOrEmpty(connectionStringName))
    //        {
    //            throw new Exception("ConnectionStringName is empty!");
    //        }
    //        m_ConnectionStringName = connectionStringName;
    //        return true;
    //    }
    //    /// <summary>
    //    /// 根据配置获取数据库类型
    //    /// </summary>
    //    /// <param name="databaseType"></param>
    //    /// <returns></returns>
    //    private DatabaseType GetDatabaseType(string databaseType)
    //    {
    //        switch (databaseType.ToUpper())
    //        {
    //            case "MYSQL":
    //                return DatabaseType.MySql;
    //            case "MSSQLSERVER":
    //            case "SQLSERVER":
    //            case "MSSQL":
    //            case "SQL":
    //                return DatabaseType.MsSqlServer;
    //            case "ORACLE":
    //                return DatabaseType.Oracle;
    //            case "SQLITE":
    //                return DatabaseType.SQLite;
    //            default:
    //                throw new Exception("unsupport database type");
    //        }
    //    }
    //    /// <summary>
    //    /// 创建数据库连接
    //    /// </summary>
    //    /// <returns></returns>
    //    public IDbConnection CreateConnection(bool isMaster = true)
    //    {
    //        DBConnection dBConnection = Shared.DataBaseConfig
    //                                          .DBConnectionManage
    //                                          .Instance
    //                                          .DBConnectionConfig
    //                                          .GetConnection(this.m_ConnectionStringName);

    //        string connectionStr = dBConnection.GetConnectionString(isMaster);

    //        switch (GetDatabaseType(dBConnection.DatabaseType))
    //        {
    //            case DatabaseType.MySql:
    //                return new MySql.Data.MySqlClient.MySqlConnection(connectionStr);
    //            case DatabaseType.MsSqlServer:
    //                return new System.Data.SqlClient.SqlConnection(connectionStr);
    //            case DatabaseType.Oracle:
    //                return new Oracle.ManagedDataAccess.Client.OracleConnection(connectionStr);
    //            case DatabaseType.SQLite:
    //                return new Microsoft.Data.Sqlite.SqliteConnection(connectionStr);
    //            default:
    //                throw new Exception("暂不支持的数据库类型");
    //        }
    //    }
    //}
    #endregion


    /// <summary>
    /// 数据库工厂
    /// </summary>
    public static class DbFactory
    {
        static DbFactory()
        {
            // Dapper 使用单数表名
            SqlMapperExtensions.TableNameMapper = type => type.Name;
        }
        /// <summary>
        /// 根据配置获取数据库类型
        /// </summary>
        /// <param name="databaseType"></param>
        /// <returns></returns>
        private static DatabaseType GetDatabaseType(string databaseType)
        {
            switch (databaseType.ToUpper())
            {
                case "MYSQL":
                    return DatabaseType.MySql;
                case "MSSQLSERVER":
                case "SQLSERVER":
                case "MSSQL":
                case "SQL":
                    return DatabaseType.MsSqlServer;
                case "ORACLE":
                    return DatabaseType.Oracle;
                case "SQLITE":
                    return DatabaseType.SQLite;
                default:
                    throw new Exception("unsupport database type");
            }
        }
        /// <summary>
        /// 创建数据库连接
        /// </summary>
        /// <returns></returns>
        public static IDbConnection CreateConnection(string connectionStringName , bool isMaster = true)
        {
            DBConnection dBConnection = Shared.DataBaseConfig
                                              .DBConnectionManage
                                              .Instance
                                              .DBConnectionConfig
                                              .GetConnection(connectionStringName);

            string connectionStr = dBConnection.GetConnectionString(isMaster);

            switch (GetDatabaseType(dBConnection.DatabaseType))
            {
                case DatabaseType.MySql:
                    return new MySql.Data.MySqlClient.MySqlConnection(connectionStr);
                case DatabaseType.MsSqlServer:
                    return new System.Data.SqlClient.SqlConnection(connectionStr);
                case DatabaseType.Oracle:
                    return new Oracle.ManagedDataAccess.Client.OracleConnection(connectionStr);
                case DatabaseType.SQLite:
                    return new Microsoft.Data.Sqlite.SqliteConnection(connectionStr);
                default:
                    throw new Exception("暂不支持的数据库类型");
            }
        }
    }
}
